package com.siwei.mes.service.laboratory.factory.material.fly;

import com.alibaba.fastjson.JSONObject;
import com.siwei.mes.common.util.JsonUtils;
import com.siwei.mes.common.util.NullUtils;
import com.siwei.mes.entity.experiment.CheckBatchConfig;
import com.siwei.mes.entity.experiment.Experiment;
import com.siwei.mes.entity.experiment.ExperimentDetail;
import com.siwei.mes.entity.experiment.flyAsk.FlyAskXd;
import com.siwei.mes.entity.laboratory.DataDefaultUc;
import com.siwei.mes.entity.system.TestProjectInfo;
import com.siwei.mes.entity.system.TestProjectSpecConfig;
import com.siwei.mes.enums.TestProjectEnum;
import com.siwei.mes.mapper.experiment.ExperimentDetailMapper;
import com.siwei.mes.mapper.laboratory.DataDefUcLaboratoryMapper;
import com.siwei.mes.mapper.laboratory.UploadLaboratoryMapper;
import com.siwei.mes.service.laboratory.factory.LaboratoryAbstractService;
import com.siwei.mes.service.laboratory.factory.entity.LaboratoryDownloadVo;
import com.siwei.mes.service.laboratory.factory.material.MaterialLaboratoryFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 粉煤灰-细度
 *
 * @Description: 粉煤灰-细度
 * @Version: 1.0
 * @author: mlchen
 * @date: 2025/3/29 17:38
 */
@Service
public class FlyXdFactory extends LaboratoryAbstractService implements MaterialLaboratoryFactory {
    private static final Logger log = LoggerFactory.getLogger("laboratory");

    @Resource
    private UploadLaboratoryMapper uploadLaboratoryMapper;
    @Resource
    private ExperimentDetailMapper experimentDetailMapper;
    @Resource
    private DataDefUcLaboratoryMapper dataDefUcLaboratoryMapper;

    private final TestProjectEnum testProjectEnum = TestProjectEnum.FLY_ASK_PARAM_FMH_XD;

    @Override
    public void processUpload(JSONObject objJson, String sampleNo, Experiment experiment, List<CheckBatchConfig> batchConfigList, List<TestProjectInfo> testProjectInfoList, List<TestProjectSpecConfig> testProjectSpecConfigList, ExperimentDetail detail, String samId) {
        log.info("开始上传到协会数据库：【粉煤灰-{}】", testProjectEnum.getName());

        //将json转成对象
        FlyAskXd flyAskXd = objJson.toJavaObject(FlyAskXd.class);
        if (flyAskXd == null) {
            log.info("粉煤灰-【{}】数据为空，跳过上传！objJson：{}", testProjectEnum.getName(), objJson);
            return;
        }

        //存储协会需要做的项目集合
        Set<String> set = new HashSet<>();

        for (TestProjectInfo testProjectInfo : testProjectInfoList) {
            if (detail.getTestProjectCode() != null && testProjectInfo.getTestCode() != null && testProjectInfo.getTestCode().equals(detail.getTestProjectCode())) {
                if (testProjectInfo.getParameterName() != null && !testProjectInfo.getParameterName().isEmpty()) {
                    //添加进协会需要做的项目集合
                    set.addAll(Arrays.asList(testProjectInfo.getParameterName().split(",")));
                }
            }
        }

        for (String str : set) {
            DataDefaultUc defaultUc = new DataDefaultUc();

            Map<String, Object> itemParameter = uploadLaboratoryMapper.findItemParameter(str, samId);

            if (itemParameter == null || itemParameter.get("ParameterID") == null) {
                log.error("未查询到对应的材料：value = " + str + "SampleID =" + samId);
                continue;
            }
            String parameterID = itemParameter.get("ParameterID").toString();

            String jcrq = flyAskXd.getJcrq();
            defaultUc.setConclusion(flyAskXd.getDxjl());
            defaultUc.setUcResultValue(flyAskXd.getDxjl());
            defaultUc.setUcTestValue(flyAskXd.getJzhxddbz());

            //获取标准值
            for (CheckBatchConfig projectInfo : batchConfigList) {
                if (projectInfo.getTestProjectCode() != null && projectInfo.getTestProjectCode().equals(TestProjectEnum.FLY_ASK_PARAM_FMH_XD.getCode())) {
                    defaultUc.setUcStandardValue(NullUtils.ifNull(projectInfo.getUnQualifiedCheckOneValue()));
                    defaultUc.setUcUnit(NullUtils.ifNull(projectInfo.getCheckValueUnit()));
                }
            }

            //根据物料信息设置判断配置
            for (TestProjectSpecConfig test : testProjectSpecConfigList) {
                if (TestProjectEnum.FLY_ASK_PARAM_FMH_XD.getCode().equals(test.getTestProjectCode())) {
                    if (experiment.getMaterialsName() != null && experiment.getMaterialsSpecs() != null && experiment.getMaterialsName().equals(test.getMaterialsName()) && experiment.getMaterialsSpecs().equals(test.getMaterialsSpec())) {
                        String json = test.getObjJson();
                        super.setUcStandardValue(defaultUc, json, "xd");
                    }
                }
            }

            //赋值
            super.setDefUc(defaultUc, experiment, "成型室", sampleNo, jcrq, detail);

            defaultUc.setUcParameterID(parameterID);//项目id

            //新增或修改DataDefaultUc
            super.insertOrUpdateDataDefaultUc(sampleNo, parameterID, defaultUc);
        }
    }

    @Override
    public LaboratoryDownloadVo processDownload(String sampleNo, Experiment experiment, ExperimentDetail detail, Map<String, String> parameterMap, String samId, List<TestProjectInfo> testProjectInfoList) {
        log.info("开始下载协数据到品控：【粉煤灰-{}】", testProjectEnum.getName());
        JSONObject objJson = detail.getObjJson();
        //将json转成对象
        FlyAskXd flyAskXd = objJson.toJavaObject(FlyAskXd.class);
        if (flyAskXd == null) {
            log.info("粉煤灰-【{}】数据为空，跳过下载！objJson：{}", testProjectEnum.getName(), objJson);
            return null;
        }


        //存储协会需要做的项目集合
        Set<String> set = new HashSet<>();
        for (TestProjectInfo testProjectInfo : testProjectInfoList) {
            if (detail.getTestProjectCode() != null && testProjectInfo.getTestCode() != null && testProjectInfo.getTestCode().equals(detail.getTestProjectCode())) {
                if (testProjectInfo.getParameterName() != null && !testProjectInfo.getParameterName().isEmpty()) {
                    //添加进协会需要做的项目集合
                    set.addAll(Arrays.asList(testProjectInfo.getParameterName().split(",")));
                }
            }
        }


        //试验依据
        Set<String> experimentGistList = new HashSet<>();
        //判断依据
        Set<String> judgeGistList = new HashSet<>();
        //仪器
        Set<String> equipmentList = new HashSet<>();
        //温度
        String temperature = "";
        //湿度
        String humidness = "";

        for (String str : set) {

            Map<String, Object> itemParameter = uploadLaboratoryMapper.findItemParameter(str, samId);

            if (itemParameter == null || itemParameter.get("ParameterID") == null) {
                log.error("未查询到对应的材料：value = " + str + "SampleID =" + samId);
                continue;
            }
            String parameterID = itemParameter.get("ParameterID").toString();

            //查询data_defalutUc 是否存在
            Map<String, Object> data = dataDefUcLaboratoryMapper.findDATA_DefaultUCBySampleNo(sampleNo, parameterID);
            if (data == null) {
                continue;
            }

            if (data.get("UCTestValue") != null) {
                flyAskXd.setJzhxddbz(data.get("UCTestValue").toString());
            }

            if (data.get("Conclusion") != null) {
                flyAskXd.setDxjl(data.get("Conclusion").toString());
            }

            if (data.get("DetectonDate") != null) {
                Date detectonDate = (Date) data.get("DetectonDate");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                String strDate = sdf.format(detectonDate);
                flyAskXd.setJcrq(strDate);
            }

            //对象转json
            JSONObject jsonObject = JsonUtils.beanToObject(flyAskXd);

            String heat = NullUtils.ifNull(data.get("Temperature"));
            String dampness = NullUtils.ifNull(data.get("Humidity"));
            String equipment = NullUtils.ifNull(data.get("Equipment"));
            String experimentGist = NullUtils.ifNull(data.get("DetectonRuleCode"));
            String judgeGist = NullUtils.ifNull(data.get("AccessRuleCode"));

            //重新赋值
            detail.setObjJson(jsonObject);

            detail.setEquipment(equipment);
            detail.setTemperature(heat);
            detail.setHumidness(dampness);
            detail.setExperimentGist(experimentGist);
            detail.setJudgeGist(judgeGist);

            experimentGistList.add(experimentGist);
            judgeGistList.add(judgeGist);
            equipmentList.add(equipment);
            temperature = heat;
            humidness = dampness;

            if (parameterMap != null && parameterMap.get(detail.getTestProjectCode()) != null) {
                detail.setStatus(parameterMap.get(detail.getTestProjectCode()));
            }

            //修改品控试验数据
            experimentDetailMapper.updateByPrimaryKeySelective(detail);

        }
        return new LaboratoryDownloadVo().setEquipmentList(equipmentList)
                .setJudgeGistList(judgeGistList)
                .setExperimentGistList(experimentGistList)
                .setTemperature(temperature)
                .setHumidness(humidness);
    }
}
